#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>

/**
标准输入输出流 （File *）标准库函数
    FILE *stdin;   标准输入
    FILE *stdout;  标准输出
    FILE *stderr;  标准错误输出
标准输入输出流的文件描述符 系统调用
    STDIN_FILENO    0  标准输入
    STDOUT_FILENO   1  标准输出
    STDERR_FILENO   2  标准错误输出
 */
// 从控制台读取字符串，不需要加'\n'
// 从控制台输出字符串，需要加'\n'
int main()
{
    // 关闭标准输出流的文件描述符 系统
    close(STDOUT_FILENO);
    close(STDERR_FILENO);

    // 重定向
    open("out.log", O_CREAT | O_WRONLY | O_APPEND, 0644); // 1
    open("err.log", O_CREAT | O_WRONLY | O_APPEND, 0644); // 2

    // 标准输入输出流
    char str_read[10];
    fgets(str_read, 10, stdin);
    printf("你输入的字符串是:%s", str_read);

    fputs("Hello, world!\n", stdout);

    fputs("Error message\n", stderr);

    // 标准输入输出流的文件描述符
    char str_read2[10];
    int len = read(STDIN_FILENO, str_read2, 10);
    printf("你输入的字符串是:%.*s", len, str_read2);

    char *str_write = "Hello, world!\n";
    write(STDOUT_FILENO, str_write, strlen(str_write));

    char *str_write2 = "Error message\n";
    write(STDERR_FILENO, str_write2, strlen(str_write2));

    return 0;
}